﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Juego_Lp.Objects;
using Juego_Lp.Characters;
using Juego_Lp.World;

static class constantes
{
    public const double MAPA_ACEPTADO = 0.7;
}

namespace Juego_Lp.World
{
    public class Game
    {
        private char opcion;
        private Map unmapa = new Map();
        private GestorDeMapas gestor;

        //private map[] listofMaps;
        public Game()
        {

        }

        //public GestorDeMapas getGestor() {
        //    return gestor;
        //}
        
        public void presentacion() {
            Console.WriteLine("************************** BATTLE DOG ***************************");
            Console.WriteLine("Ese juego se trata sobre la lucha de proteger a la base de los enemigos");
            Console.WriteLine("poniendo soldaditos para que se pueda evitar el ataque");
            Console.WriteLine("*****************************************************************");
            Console.WriteLine("");
        }
       
        public char mostrar_opciones_soldados()
        {
            System.Console.WriteLine("TIPOS SOLDADOS");
            System.Console.WriteLine("1) Pistolero");
            System.Console.WriteLine("2) Bombardero");
            System.Console.WriteLine("3) LanzaLlamas");
            System.Console.WriteLine("4) JUGAR");
            System.Console.WriteLine("8) Reiniciar");
            System.Console.WriteLine("9) Salir");
            System.Console.Write("Opcion:     ");

            ConsoleKeyInfo result = Console.ReadKey();

            Console.WriteLine();

            return result.KeyChar;
        }

        public Map getMapa()
        {
            return this.unmapa;
        }


        /*public int mostrar_opciones_soldados()
        {
            int opcion;
            Console.WriteLine("SELECCIONE EL TIPO DE SOLDADOS QUE AGREGARA AL MAPA:");
            Console.WriteLine("1: SOLDADO     2:LANZ LLAMA    3:BAZOOKA");
            opcion = Convert.ToInt32(Console.ReadKey());
            return opcion;
        }*/

        public void imprimirCeldas(){
            for (int i = 0; i < unmapa.getLimiteX(); i++) Console.Write('-');
            Console.WriteLine();
            for (int j = 0; j < unmapa.getLimiteY(); j++)
            {
                for (int i = 0; i < unmapa.getLimiteX(); i++)
                {
                    //if (mapa.getCeldas(i, j).getImagen()==) System.out.print("no hay imagen, no hay nada");
                    Console.Write(unmapa.getTablero(i, j).getTipoElemento());
                }
                Console.WriteLine("|");
            }
            for (int i = 0; i < unmapa.getLimiteX(); i++) Console.Write('-');
            Console.WriteLine();
        }

        public bool verificarLimites(int x,int y)
        {
            if ( ((0 <= x) && (x <= unmapa.getLimiteX()) &&
                  (0 <= y) && (y <= unmapa.getLimiteY())) == true) 
                return true;
            return false;
        }


        public void registrar_soldados(char n)
        {
            Soldiers asoldier = new Soldiers();
            asoldier.setType(n);
            if (n == '1')
            {
                Gun agun = new Gun();
                asoldier.setMyWeapon(agun);

            }
            if (n == '2')
            {
                ThrowFire atfire = new ThrowFire();
                asoldier.setMyWeapon(atfire);

            }

            if (n == '3')
            {
                Bazooka abazooka = new Bazooka();
                asoldier.setMyWeapon(abazooka);

            }
            this.unmapa.setSoldiers(asoldier);
           

        }



        internal char confirmacionSalir()
        {
            throw new NotImplementedException();
        }

        public void colocar_soldado(int x, int y,int i,char n)
        {
            Console.WriteLine();
            Console.WriteLine("=====================================");
            Console.WriteLine("Donde desea colocar al soldado " + i);
            Console.WriteLine("=====================================");
            Console.Write("Posición Horizontal: ");

            string posX = Console.ReadLine();
            
            while (true){
                if (int.TryParse(posX, out x))
                {
                    if (x > (int)(constantes.MAPA_ACEPTADO*unmapa.getLimiteX() )) {
                        Console.WriteLine("Coloque un valor correcto, debe ser menor a " + constantes.MAPA_ACEPTADO*unmapa.getLimiteX());
                        Console.WriteLine("Coloque de nuevo la posición horizontal");
                        Console.Write("Posición Horizontal: ");
                        posX = Console.ReadLine();  
                        continue;
                    }
                    break;
                }
                else {
                    Console.WriteLine("Coloque un valor numérico"); 
                    Console.WriteLine("Coloque de nuevo la posición horizontal");
                    Console.Write("Posición Horizontal: ");
                    posX = Console.ReadLine();
                    continue;
                }                
            }

            x = System.Convert.ToInt32(posX);
            
            Console.Write("Posición Vertical: ");

            string posY = Console.ReadLine();

            while (true)
            {
                if (int.TryParse(posY, out y))
                {
                    if (y > unmapa.getLimiteY())
                    {
                        Console.WriteLine("Coloque un valor correcto, debe ser menor a " + unmapa.getLimiteY());
                        Console.WriteLine("Coloque de nuevo la posición vertical");
                        Console.Write("Posición Vertical: ");
                        posY = Console.ReadLine();
                        continue;
                    }
                    break;
                }
                else
                {
                    Console.WriteLine("Coloque un valor numérico");
                    Console.WriteLine("Coloque de nuevo la posición vertical");
                    Console.Write("Posición Vertical: ");
                    posY = Console.ReadLine();
                    continue;
                }
            }

            y = System.Convert.ToInt32(posY);

            unmapa.actualizarMapa(x, y, n);
        }

        public void creaMonstruos()
        {
            Random r = new Random(DateTime.Now.Millisecond);
            int numMons = r.Next(3, 10);

            Console.WriteLine("Se crearan" + numMons + " monstruos en esta partida");
            for (int i = 1; i <= numMons;i++ ) 
            {
                int posX = r.Next(40,60);
                int posY = r.Next(1,30);

                unmapa.getTablero(posX, posY).setTipoElemento('M');
            }
        }



    }
}
    
